#include "iostream"
using namespace std;
class AddClass {
private:
	int a, b;
public:
	int add(int aa, int bb);
    // 类的静态成员函数属于类，为所有对象所共享，它没有this指针，因此这里我们采用静态成员函数作为回调函数。
    // 就是静态成员函数是无法访问类的非静态成员的，因此如果用户有访问非静态成员的需求，那么需要在静态成员函数的参数列表中做一点小小的修改。在形参列表中加入万能指针void*作为一个形参，然后在函数体中再进行类型强转。
	static int add1(int aa, int bb,void* temp);
	static int add2(int aa, int bb);
};
int AddClass::add1(int aa, int bb, void* p) {
    //就是静态成员函数是无法访问类的非静态成员的，因此如果用户有访问非静态成员的需求，那么需要在静态成员函数的参数列表中做一点小小的修改。在形参列表中加入万能指针void*作为一个形参，
	AddClass* temp = (AddClass*)p;
	if (temp) {
		temp->a = aa;
		temp->b = bb;
	}		
	return temp->a + temp->b;
}

// int AddClass::add2(int aa, int bb) {
//     a = aa;
// 	b = bb;
// 	return temp->a + temp->b;
// }

int AddClass::add(int aa, int bb) {
	a = aa;
	b = bb;
	return a + b;
}
void Add(int(*callbackfun)(int, int), int a, int b) {
	cout << callbackfun(a, b) << endl;
}
int myAdd(int aa, int bb) {
	AddClass a;
	return a.add(aa,bb);
}


typedef int(*callbackfun1)(int, int, void*);
void Add1(callbackfun1 pf, int a, int b,void* p) {
	cout << pf(a, b,p) << endl;
}

int main()
{
	// Add(AddClass().add, 1, 2);//不能，错误,非静态成员函数，参数列表中包含了this 指针
	Add(myAdd, 1, 2);
	Add(AddClass().add1, 1, 2);
    
    AddClass* a = new AddClass;
	Add1(AddClass::add1, 1, 2, a);

    return 0;
}